From 2db2c568f013b1828c87c324578fad03e81d9daf 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 (cherry picked from commit 9c6195a2da982df3d00439d01f9c44dcc4c9f19e) --- 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 fbcef0754cdc4c3b46dcf13a037273058f6e2cab 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 (cherry picked from commit 6f45f682c44b857f7cf9be8cbdfeb938194e8f21) --- 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>; }; }; };