Commit 399f177f authored by Bjarki Arge Andreasen's avatar Bjarki Arge Andreasen Committed by Benjamin Cabé
Browse files

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: default avatarBjarki Arge Andreasen <bjarki.andreasen@nordicsemi.no>
(cherry picked from commit 9c6195a2)
parent 0ac2d654
Loading
Loading
Loading
Loading
+4 −9
Changes for drivers/flash/flash_sam.c: 4 added lines, 9 removed lines.
Original line number Diff line number Diff line
@@ -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);