Hello Tudor, On 22/11/2018 13:36, Tudor.Ambarus@xxxxxxxxxxxxx wrote: > From: Tudor Ambarus <tudor.ambarus@xxxxxxxxxxxxx> > > Bug reported for the out-of-tree S25FS128S flash memory. > > BFPT table advertises all the erase types supported by all the > possible map configurations. Update the erase_type array to indicate > which erase types are applicable to the current map configuration. > > Backward compatibility test done on sst26vf064b. > > Fixes: b038e8e3be72 ("mtd: spi-nor: parse SFDP Sector Map Parameter Table") > Reported-by: Alexander Sverdlin <alexander.sverdlin@xxxxxxxxx> > Signed-off-by: Tudor Ambarus <tudor.ambarus@xxxxxxxxxxxxx> > --- > drivers/mtd/spi-nor/spi-nor.c | 29 ++++++++++++++++++++++++++++- > 1 file changed, 28 insertions(+), 1 deletion(-) > > diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c > index 93c9bc8931fc..a71adcd6ddfa 100644 > --- a/drivers/mtd/spi-nor/spi-nor.c > +++ b/drivers/mtd/spi-nor/spi-nor.c > @@ -3000,7 +3000,8 @@ static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor, > u64 offset; > u32 region_count; > int i, j; > - u8 erase_type, uniform_erase_type; > + u8 uniform_erase_type, save_uniform_erase_type; > + u8 erase_type, regions_erase_type; > > region_count = SMPT_MAP_REGION_COUNT(*smpt); > /* > @@ -3014,6 +3015,7 @@ static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor, > map->regions = region; > > uniform_erase_type = 0xff; > + regions_erase_type = 0; > offset = 0; > /* Populate regions. */ > for (i = 0; i < region_count; i++) { > @@ -3030,13 +3032,38 @@ static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor, > */ > uniform_erase_type &= erase_type; > > + /* > + * regions_erase_type mask will indicate all the erase types > + * supported in this configuration map. > + */ > + regions_erase_type |= erase_type; > + > offset = (region[i].offset & ~SNOR_ERASE_FLAGS_MASK) + > region[i].size; > } > > + save_uniform_erase_type = map->uniform_erase_type; > map->uniform_erase_type = spi_nor_sort_erase_mask(map, > uniform_erase_type); > > + if (!regions_erase_type) { > + /* > + * Roll back to the previous uniform_erase_type mask, SMPT is > + * broken. > + */ > + map->uniform_erase_type = save_uniform_erase_type; > + return -EINVAL; > + } > + > + /* > + * BFPT table advertises all the erase types supported by all the > + * possible map configurations. Update the erase_type array to indicate > + * which erase types are applicable to the current map configuration. > + */ > + for (i = 0; i < SNOR_ERASE_TYPE_MAX; i++) > + if (!(regions_erase_type & BIT(erase[i].idx))) > + spi_nor_set_erase_type(&erase[i], 0, 0xFF); have you noticed the following: .../drivers/mtd/spi-nor/spi-nor.c: In function ‘spi_nor_init_non_uniform_erase_map’: .../drivers/mtd/spi-nor/spi-nor.c:2940:27: error: passing argument 1 of ‘spi_nor_set_erase_type’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers] spi_nor_set_erase_type(&erase[i], 0, 0xFF); ^ .../drivers/mtd/spi-nor/spi-nor.c:2368:13: note: expected ‘struct spi_nor_erase_type *’ but argument is of type ‘const stru ct spi_nor_erase_type *’ static void spi_nor_set_erase_type(struct spi_nor_erase_type *erase, ^~~~~~~~~~~~~~~~~~~~~~ > + > spi_nor_region_mark_end(®ion[i - 1]); > > return 0; -- Best regards, Alexander Sverdlin. ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/