From ee992f2170432ff6ada2e7f4f4a1b6ed9ce01482 Mon Sep 17 00:00:00 2001 From: Bjarki Arge Andreasen Date: Sun, 3 Nov 2024 20:36:38 +0100 Subject: [PATCH 1/2] drivers: flash: sam: fix flash erase last page The implementation for erasing pages in the flash_sam.c driver indicated a successful erase after exceeding the last page to be erased successfully. Since the last page has no proceeding page, the succeeded status was not set. This fix switches around the status to be set as succeeded before erase begins, to have the succeeded status cleared if page unlock or erase fails. Signed-off-by: Bjarki Arge Andreasen --- drivers/flash/flash_sam.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/drivers/flash/flash_sam.c b/drivers/flash/flash_sam.c index ba439bdec335b..bb248fdf38e71 100644 --- a/drivers/flash/flash_sam.c +++ b/drivers/flash/flash_sam.c @@ -396,17 +396,12 @@ static bool sam_flash_erase_foreach_page(const struct flash_pages_info *info, vo /* Check if we've reached the end of pages to erase */ if (info->start_offset >= erase_data->section_end) { /* Succeeded, stop iterating */ - erase_data->succeeded = true; return false; } - if (sam_flash_unlock_page(dev, info) < 0) { - /* Failed to unlock page, stop iterating */ - return false; - } - - if (sam_flash_erase_page(dev, info) < 0) { - /* Failed to erase page, stop iterating */ + if (sam_flash_unlock_page(dev, info) || sam_flash_erase_page(dev, info)) { + /* Failed to unlock page and erase page, stop iterating */ + erase_data->succeeded = false; return false; } @@ -436,7 +431,7 @@ static int sam_flash_erase(const struct device *dev, off_t offset, size_t size) key = k_spin_lock(&sam_data->lock); sam_data->erase_data.section_start = offset; sam_data->erase_data.section_end = offset + size; - sam_data->erase_data.succeeded = false; + sam_data->erase_data.succeeded = true; flash_page_foreach(dev, sam_flash_erase_foreach_page, sam_data); if (!sam_data->erase_data.succeeded) { k_spin_unlock(&sam_data->lock, key); From ea1b6b9d78ca7427a649cfff1f7527f1cdf4a3af Mon Sep 17 00:00:00 2001 From: Bjarki Arge Andreasen Date: Wed, 5 Mar 2025 18:14:46 +0100 Subject: [PATCH 2/2] dts: arm: atmel: samx7xx21: fix flash erase-blocks The flash erase-blocks property was a bit malformed, it has 254 pages of size 8192 after the first 8 pages of size 2048 to reach the total size of 2048K. This caused issues when trying to erase the last pages of the flash, which caused the flash erase_blocks test suite to fail. Adjust the erase-blocks to match the flash layout. Signed-off-by: Bjarki Arge Andreasen --- dts/arm/atmel/samx7xx21.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dts/arm/atmel/samx7xx21.dtsi b/dts/arm/atmel/samx7xx21.dtsi index 9433e3063aaf8..608672b4129da 100644 --- a/dts/arm/atmel/samx7xx21.dtsi +++ b/dts/arm/atmel/samx7xx21.dtsi @@ -16,7 +16,7 @@ flash-controller@400e0c00 { flash0: flash@400000 { reg = <0x00400000 DT_SIZE_K(2048)>; - erase-blocks = <&eefc 8 2048>, <&eefc 252 8192>; + erase-blocks = <&eefc 8 2048>, <&eefc 254 8192>; }; }; };