[PATCH v4 2/4] mtd: spi-nor: core: get rid of SNOR_LAST_REGION flag
Tudor Ambarus
tudor.ambarus at linaro.org
Mon Feb 26 03:15:35 PST 2024
On 20.02.2024 10:34, tkuw584924 at gmail.com wrote:
> @@ -1682,48 +1636,41 @@ static int spi_nor_init_erase_cmd_list(struct spi_nor *nor,
> struct spi_nor_erase_region *region;
> struct spi_nor_erase_command *cmd = NULL;
> u64 region_end;
> + unsigned int i;
> int ret = -EINVAL;
>
> - region = spi_nor_find_erase_region(map, addr);
> - if (IS_ERR(region))
> - return PTR_ERR(region);
> -
> - region_end = spi_nor_region_end(region);
> + for (i = 0; i < map->n_regions; i++) {
> + region = &map->regions[i];
> + region_end = spi_nor_region_end(region);
>
> - while (len) {
> - erase = spi_nor_find_best_erase_type(map, region, addr, len);
> - if (!erase)
> - goto destroy_erase_cmd_list;
> -
> - if (prev_erase != erase ||
> - erase->size != cmd->size ||
> - region->flags & SNOR_OVERLAID_REGION) {
> - cmd = spi_nor_init_erase_cmd(region, erase);
> - if (IS_ERR(cmd)) {
> - ret = PTR_ERR(cmd);
> + while (len && addr >= region->offset && addr < region_end) {
> + erase = spi_nor_find_best_erase_type(map, region, addr,
> + len);
> + if (!erase)
> goto destroy_erase_cmd_list;
> - }
>
> - list_add_tail(&cmd->list, erase_list);
> - } else {
> - cmd->count++;
> - }
> -
> - addr += cmd->size;
> - len -= cmd->size;
> + if (prev_erase != erase || erase->size != cmd->size ||
> + region->flags & SNOR_OVERLAID_REGION) {
> + cmd = spi_nor_init_erase_cmd(region, erase);
> + if (IS_ERR(cmd)) {
> + ret = PTR_ERR(cmd);
> + goto destroy_erase_cmd_list;
> + }
> +
> + list_add_tail(&cmd->list, erase_list);
> + } else {
> + cmd->count++;
> + }
>
> - if (len && addr >= region_end) {
> - region = spi_nor_region_next(region);
> - if (!region)
> - goto destroy_erase_cmd_list;
> - region_end = spi_nor_region_end(region);
> + len -= cmd->size;
> + addr += cmd->size;
> + prev_erase = erase;
> }
>
> - prev_erase = erase;
> + if (!len)
> + return 0;
breaking the for loop here is odd and confusing.
I'll update this patch with the following:
diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c
index 44427d58c082..eda49c30958d 100644
--- a/drivers/mtd/spi-nor/core.c
+++ b/drivers/mtd/spi-nor/core.c
@@ -1688,7 +1688,7 @@ static int spi_nor_init_erase_cmd_list(struct
spi_nor *nor,
unsigned int i;
int ret = -EINVAL;
- for (i = 0; i < map->n_regions; i++) {
+ for (i = 0; i < map->n_regions && len; i++) {
region = &map->regions[i];
region_end = region->offset + region->size;
@@ -1715,11 +1715,10 @@ static int spi_nor_init_erase_cmd_list(struct
spi_nor *nor,
addr += cmd->size;
prev_erase = erase;
}
-
- if (!len)
- return 0;
}
+ return 0;
+
destroy_erase_cmd_list:
spi_nor_destroy_erase_cmd_list(erase_list);
return ret;
> }
>
> - return 0;
> -
> destroy_erase_cmd_list:
> spi_nor_destroy_erase_cmd_list(erase_list);
> return ret;
More information about the linux-mtd
mailing list