This is an automated email from Gerrit. "Jérôme Pouiller <[email protected]>" just uploaded a new patch set to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/9480
-- gerrit commit a2ef320325b0dee72bf6eb6eac1138381f1f4b2c Author: Jérôme Pouiller <[email protected]> Date: Thu Feb 26 14:21:38 2026 +0100 flash/nor/efm32: Use target_get_working_area_avail() Use the newer API target_get_working_area_avail() rather than testing the possible buffer_size in a loop. Change-Id: Iccd238284dabdcb45a00b208de42bc48dbc5e060 Signed-off-by: Jérôme Pouiller <[email protected]> diff --git a/src/flash/nor/efm32.c b/src/flash/nor/efm32.c index 97d737ba60..372381f6ae 100644 --- a/src/flash/nor/efm32.c +++ b/src/flash/nor/efm32.c @@ -896,12 +896,11 @@ static int efm32_write_block(struct flash_bank *bank, const uint8_t *buf, { struct efm32_flash_chip *efm32_info = bank->driver_priv; struct target *target = bank->target; - uint32_t buffer_size = 16384; - struct working_area *write_algorithm; - struct working_area *source; - struct reg_param reg_params[5]; + struct working_area *write_algorithm, *source; struct armv7m_algorithm armv7m_info; - int ret = ERROR_OK; + struct reg_param reg_params[5]; + uint32_t buffer_size; + int ret; /* flash write code */ if (target_alloc_working_area(target, @@ -914,22 +913,19 @@ static int efm32_write_block(struct flash_bank *bank, const uint8_t *buf, ret = target_write_buffer(target, write_algorithm->address, efm32_info->info.msc_offset->flash_write_code_len, efm32_info->info.msc_offset->flash_write_code); - if (ret != ERROR_OK) + if (ret) return ret; /* memory buffer */ - while (target_alloc_working_area_try(target, buffer_size, &source) != ERROR_OK) { - buffer_size /= 2; - buffer_size &= ~3UL; /* Make sure it's 4 byte aligned */ - if (buffer_size <= 256) { - /* we already allocated the writing code, but failed to get a - * buffer, free the algorithm */ - target_free_working_area(target, write_algorithm); - + buffer_size = target_get_working_area_avail(target); + if (buffer_size <= 256) { LOG_WARNING("no large enough working area available, can't do block memory writes"); return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; - } } + buffer_size = MIN(buffer_size, 16 * 1024); + ret = target_alloc_working_area(target, buffer_size, &source); + if (ret) + return ret; init_reg_param(®_params[0], "r0", 32, PARAM_IN_OUT); /* flash base (in), status (out) */ init_reg_param(®_params[1], "r1", 32, PARAM_OUT); /* count (word-32bit) */ --
