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(&reg_params[0], "r0", 32, PARAM_IN_OUT); /* flash base 
(in), status (out) */
        init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);    /* count 
(word-32bit) */

-- 

Reply via email to