NAND fixes:
- Fix BBT cache allocation done in nanddev_bbt_init() SPI NOR fixes: - Fix the erase type selection logic -----BEGIN PGP SIGNATURE----- iQJQBAABCgA6FiEEKmCqpbOU668PNA69Ze02AX4ItwAFAlwBB7AcHGJvcmlzLmJy ZXppbGxvbkBib290bGluLmNvbQAKCRBl7TYBfgi3AAQVEACN88T8lUasAdTzXmYk DtldyZrGsdQjLPVlFcvMyI4Tevg+1JblVVbq+i0sin1Ac2igye5Vcof6HXLlM6dO HYoP/0DUtL5zI5YugzqCnEIlOeRgqs8cVpf6UxQY/ptP6SkbBbKZc2Ay5N+k8T7g Ww5tJGryEIbLYKm6H/HNgKi7tXIQ3ilxrBhjJY/HxUEO972+YKsDvZNkb/iv2l3W LokmPVUo1Pwrc6FIH1uQ4GGS59uoO+ckZypAR/j3sCqRmOBgYm1irQU7EjGbR/jp nheCVfuPACLECkm2OEYXmcMxrIARilk8E48gFKhzS6OCqx8UsXhf/K2vzqKEpjUw H6rXeZb5L1EZDqS8urtYzn/+7A7zUzPXWn76PLVq3/bOYbyYRnyWzD+j+EAisQWq Kj/Uxlx4KHUZ42ko9arL53qFr4rrGdCVTpvVWPTSOcYH2J/V/KN28UBhVfOOuiPL AKEeBkQbEKmURsOpubVtvpLFEdQOaUDcFCBAe3vUmsQklJAlFRWCku90enaypt79 OY5pPPdcIcseZXU9A25wyG47NX9loTschqZwgcdxol2sF6k8eiB5c6yptKbrNXRM 0s4desrc9b9fzdjT27X9ALwP1trZMBt24bANq/EYqbe5su15trATJFBatxp35HF3 tO12WhOX/+jYMIakPNKV9UdQbA== =zfLt -----END PGP SIGNATURE----- Merge tag 'mtd/fixes-for-4.20-rc5' of git://git.infradead.org/linux-mtd Pull mtd fixes from Boris Brezillon: "NAND fix: - Fix BBT cache allocation done in nanddev_bbt_init() SPI NOR fixes: - Fix the erase type selection logic" * tag 'mtd/fixes-for-4.20-rc5' of git://git.infradead.org/linux-mtd: mtd: nand: Fix memory allocation in nanddev_bbt_init() mtd: spi-nor: fix erase_type array to indicate current map conf
This commit is contained in:
commit
da59f180d5
|
@ -27,7 +27,8 @@ int nanddev_bbt_init(struct nand_device *nand)
|
|||
unsigned int nwords = DIV_ROUND_UP(nblocks * bits_per_block,
|
||||
BITS_PER_LONG);
|
||||
|
||||
nand->bbt.cache = kzalloc(nwords, GFP_KERNEL);
|
||||
nand->bbt.cache = kcalloc(nwords, sizeof(*nand->bbt.cache),
|
||||
GFP_KERNEL);
|
||||
if (!nand->bbt.cache)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
@ -2995,12 +2995,13 @@ static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor,
|
|||
const u32 *smpt)
|
||||
{
|
||||
struct spi_nor_erase_map *map = &nor->erase_map;
|
||||
const struct spi_nor_erase_type *erase = map->erase_type;
|
||||
struct spi_nor_erase_type *erase = map->erase_type;
|
||||
struct spi_nor_erase_region *region;
|
||||
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 advertises all the erase types supported by all the possible
|
||||
* map configurations. Mask out the erase types that are not supported
|
||||
* by 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);
|
||||
|
||||
spi_nor_region_mark_end(®ion[i - 1]);
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue