Skip to content
Snippets Groups Projects
Commit f3dec798 authored by Ladislav Michl's avatar Ladislav Michl Committed by Stefan Roese
Browse files

CFI: fix eraseregions numblocks


eraseregions numblocks was sometimes one less than actual, possibly producing
erase regions with zero blocks. As MTD code touches eraseregions only if
numeraseregions is greater that zero, allocate eraseregions only for non
uniform erase size flash.

Signed-off-by: default avatarLadislav Michl <ladis@linux-mips.org>
Signed-off-by: default avatarStefan Roese <sr@denx.de>
parent 9b208ece
No related branches found
No related tags found
No related merge requests found
...@@ -161,8 +161,8 @@ static int cfi_mtd_set_erasesize(struct mtd_info *mtd, flash_info_t *fi) ...@@ -161,8 +161,8 @@ static int cfi_mtd_set_erasesize(struct mtd_info *mtd, flash_info_t *fi)
int sect; int sect;
int regions = 0; int regions = 0;
int numblocks = 0; int numblocks = 0;
ulong offset = 0; ulong offset;
ulong base_addr = fi->start[0]; ulong base_addr;
/* /*
* First detect the number of eraseregions so that we can allocate * First detect the number of eraseregions so that we can allocate
...@@ -174,29 +174,35 @@ static int cfi_mtd_set_erasesize(struct mtd_info *mtd, flash_info_t *fi) ...@@ -174,29 +174,35 @@ static int cfi_mtd_set_erasesize(struct mtd_info *mtd, flash_info_t *fi)
sect_size_old = flash_sector_size(fi, sect); sect_size_old = flash_sector_size(fi, sect);
} }
switch (regions) {
case 0:
return 1;
case 1: /* flash has uniform erase size */
mtd->numeraseregions = 0;
mtd->erasesize = sect_size_old;
return 0;
}
mtd->numeraseregions = regions;
mtd->eraseregions = malloc(sizeof(struct mtd_erase_region_info) * regions); mtd->eraseregions = malloc(sizeof(struct mtd_erase_region_info) * regions);
/* /*
* Now detect the largest sector and fill the eraseregions * Now detect the largest sector and fill the eraseregions
*/ */
sect_size_old = 0;
regions = 0; regions = 0;
base_addr = offset = fi->start[0];
sect_size_old = flash_sector_size(fi, 0);
for (sect = 0; sect < fi->sector_count; sect++) { for (sect = 0; sect < fi->sector_count; sect++) {
if ((sect_size_old != flash_sector_size(fi, sect)) && if (sect_size_old != flash_sector_size(fi, sect)) {
(sect_size_old != 0)) {
mtd->eraseregions[regions].offset = offset - base_addr; mtd->eraseregions[regions].offset = offset - base_addr;
mtd->eraseregions[regions].erasesize = sect_size_old; mtd->eraseregions[regions].erasesize = sect_size_old;
mtd->eraseregions[regions].numblocks = numblocks; mtd->eraseregions[regions].numblocks = numblocks;
/* Now start counting the next eraseregions */ /* Now start counting the next eraseregions */
numblocks = 0; numblocks = 0;
regions++; regions++;
} else {
numblocks++;
}
if (sect_size_old != flash_sector_size(fi, sect))
offset = fi->start[sect]; offset = fi->start[sect];
}
numblocks++;
/* /*
* Select the largest sector size as erasesize (e.g. for UBI) * Select the largest sector size as erasesize (e.g. for UBI)
...@@ -212,12 +218,7 @@ static int cfi_mtd_set_erasesize(struct mtd_info *mtd, flash_info_t *fi) ...@@ -212,12 +218,7 @@ static int cfi_mtd_set_erasesize(struct mtd_info *mtd, flash_info_t *fi)
*/ */
mtd->eraseregions[regions].offset = offset - base_addr; mtd->eraseregions[regions].offset = offset - base_addr;
mtd->eraseregions[regions].erasesize = sect_size_old; mtd->eraseregions[regions].erasesize = sect_size_old;
mtd->eraseregions[regions].numblocks = numblocks + 1; mtd->eraseregions[regions].numblocks = numblocks;
if (regions)
mtd->numeraseregions = regions + 1;
else
mtd->numeraseregions = 0;
mtd->erasesize = sect_size; mtd->erasesize = sect_size;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment