On Mon, 2020-03-23 at 09:24 +0000, Tudor.Ambarus@xxxxxxxxxxxxx wrote: > From: Tudor Ambarus <tudor.ambarus@xxxxxxxxxxxxx> > > When there are more BP settings than needed for defining the > protected > areas of the flash memory, most flashes will define the remaining > settings as "protect all", i.e. the equivalent of having all the BP > bits > set to one. But there are flashes where the in-between BP values > are undefined (not mentioned), and only the "all bits set" is > protecting > the entire memory. One such example is w25q80, where BP[2:0]=0b101 > and > 0b110 are not defined. > > Set all the BP bits to one when lock_len == mtd->size, to treat this > special case. > > Suggested-by: Michael Walle <michael@xxxxxxxx> > Signed-off-by: Tudor Ambarus <tudor.ambarus@xxxxxxxxxxxxx> > --- > drivers/mtd/spi-nor/core.c | 20 +++++++++++++------- > 1 file changed, 13 insertions(+), 7 deletions(-) > > diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c > index 36660068bc04..3788a95c0a47 100644 > --- a/drivers/mtd/spi-nor/core.c > +++ b/drivers/mtd/spi-nor/core.c > @@ -1660,13 +1660,19 @@ static int spi_nor_sr_lock(struct spi_nor > *nor, loff_t ofs, uint64_t len) > * > * pow = ceil(log2(size / len)) = log2(size) - > floor(log2(len)) + 1 > */ > - pow = ilog2(mtd->size) - ilog2(lock_len) + 1; > - val = mask - (pow << SR_BP_SHIFT); > - if (val & ~mask) > - return -EINVAL; > - /* Don't "lock" with no region! */ > - if (!(val & mask)) > - return -EINVAL; > + if (lock_len == mtd->size) { > + val = mask; > + } else { > + pow = ilog2(mtd->size) - ilog2(lock_len) + 1; > + val = mask - (pow << SR_BP_SHIFT); > + > + if (val & ~mask) > + return -EINVAL; > + > + /* Don't "lock" with no region! */ > + if (!(val & mask)) > + return -EINVAL; > + } > > status_new = (status_old & ~mask & ~tb_mask) | val; > Reviewed-by: Jungseung Lee <js07.lee@xxxxxxxxxxx> ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/